#include "cc.h"
#if (CC_CHANNEL_MODE)
void cc_init(void)
{
    #if (CC_CHANNEL_MODE & CC0)
        CC0_POLARITY_SET(0);
        CC0_DUTY_SET(0);
        CC0_MODE_COMPARE_SET(1);
        sys_delay_ms(5);
        #if (GPIO_P02_CC_MODE == CC0)
            _P02_IO_CC0();
        #endif
        #if (GPIO_P04_CC_MODE == CC0)
            _P04_IO_CC0();
        #endif  
        #if (GPIO_P23_CC_MODE == CC0)
            _P23_IO_CC0();
        #endif 
        #if (GPIO_P25_CC_MODE == CC0)
            _P25_IO_CC0();
        #endif   
    #endif
    #if (CC_CHANNEL_MODE & CC1)
        CC1_POLARITY_SET(0);
        CC1_DUTY_SET(0);
        CC1_MODE_COMPARE_SET(1);
        sys_delay_ms(1);
        #if (GPIO_P05_CC_MODE == CC1)
            _P05_IO_CC1();
        #endif
        #if (GPIO_P10_CC_MODE == CC1)
            _P10_IO_CC1();
        #endif   
        #if (GPIO_P26_CC_MODE == CC1)
            _P26_IO_CC1();
        #endif   
    #endif
    #if (CC_CHANNEL_MODE & CC2)
        CC2_POLARITY_SET(0);
        CC2_DUTY_SET(0);
        CC2_MODE_COMPARE_SET(1);
        sys_delay_ms(5);
        #if (GPIO_P06_CC_MODE == CC2)
            _P06_IO_CC2();
        #endif
        #if (GPIO_P14_CC_MODE == CC2)
            _P14_IO_CC2();
        #endif
        #if (GPIO_P15_CC_MODE == CC2)
            _P15_IO_CC2();
        #endif
        #if (GPIO_P27_CC_MODE == CC2)
            _P27_IO_CC2();
        #endif
    #endif
    #if (CC_CHANNEL_MODE & CC3)
        CC3_POLARITY_SET(0);
        CC3_DUTY_SET(0);
        CC3_MODE_COMPARE_SET(1);
        sys_delay_ms(5);
        #if (GPIO_P07_CC_MODE == CC3)
            _P07_IO_CC3();
        #endif
        #if (GPIO_P30_CC_MODE == CC3)
            _P30_IO_CC3();
        #endif
    #endif
}

void cc_set_polarity(uint8_t cc, uint8_t polarity)
{
    CC_POLARITY_SET(cc, polarity);
}

void cc_set_duty(uint8_t cc, uint16_t duty)
{
    switch (cc)
    {
    #if (CC_CHANNEL_MODE & CC0)
        case CC0:
            CC0_DUTY_SET(duty);
            break;
    #endif
    #if (CC_CHANNEL_MODE & CC1)
        case CC1:
            CC1_DUTY_SET(duty);
            break;
    #endif
    #if (CC_CHANNEL_MODE & CC2)
        case CC2:
            CC2_DUTY_SET(duty);
            break;
    #endif
    #if (CC_CHANNEL_MODE & CC3)
        case CC3:
            CC3_DUTY_SET(duty);
            break;
    #endif
        default:
            break;
    }
}

void cc_exit(void)
{
    /**
     * @brief diable CC
     * 1. set cc to gpio
     * 2. set io is low
     * 3. set io is output
     */

    TICK_DISABLE();
    #if (GPIO_P02_CC_MODE == CC0)
        _P02_IO_MODE();
        _P02_EN(low);
        _P02_IO_OUTPUT();
    #endif
    #if (GPIO_P04_CC_MODE == CC0)
        _P04_IO_MODE();
        _P04_EN(low);
        _P04_IO_OUTPUT();
    #endif 
    #if (GPIO_P23_CC_MODE == CC0)
        _P23_IO_MODE();
        _P23_EN(low);
        _P23_IO_OUTPUT();
    #endif 
    #if (GPIO_P25_CC_MODE == CC0)
        _P25_IO_MODE();
        _P25_EN(low);
        _P25_IO_OUTPUT();
    #endif 
    #if (GPIO_P05_CC_MODE == CC1)
        _P05_IO_MODE();
        _P05_EN(low);
        _P05_IO_OUTPUT();
    #endif
    #if (GPIO_P10_CC_MODE == CC1)
        _P10_IO_MODE();
        _P10_EN(low);
        _P10_IO_OUTPUT();
    #endif  
    #if (GPIO_P26_CC_MODE == CC1)
        _P26_IO_MODE();
        _P26_EN(low);
        _P26_IO_OUTPUT();
    #endif  
    #if (GPIO_P06_CC_MODE == CC2)
        _P06_IO_MODE();
        _P06_EN(low);
        _P06_IO_OUTPUT();
    #endif
    #if (GPIO_P14_CC_MODE == CC2)
        _P14_IO_MODE();
        _P14_EN(low);
        _P14_IO_OUTPUT();
    #endif
    #if (GPIO_P15_CC_MODE == CC2)
        _P15_IO_MODE();
        _P15_EN(low);
        _P15_IO_OUTPUT();
    #endif
    #if (GPIO_P27_CC_MODE == CC2)
        _P27_IO_MODE();
        _P27_EN(low);
        _P27_IO_OUTPUT();
    #endif
    #if (GPIO_P07_CC_MODE == CC3)
        _P07_IO_MODE();
        _P07_EN(low);
        _P07_IO_OUTPUT();
    #endif
    #if (GPIO_P30_CC_MODE == CC3)
        _P30_IO_MODE();
        _P30_EN(low);
        _P30_IO_OUTPUT();
    #endif
    TICK_ENABLE();
}

void cc_io_enable(uint8_t cc)
{
    switch (cc)
    {
        case CC0:
        #if (GPIO_P02_CC_MODE == CC0)
            _P02_IO_CC0();
        #endif
        #if (GPIO_P04_CC_MODE == CC0)
            _P04_IO_CC0();
        #endif 
        #if (GPIO_P23_CC_MODE == CC0)
            _P23_IO_CC0();
        #endif 
        #if (GPIO_P25_CC_MODE == CC0)
            _P25_IO_CC0();
        #endif 
        break;

        case CC1:
        #if (GPIO_P05_CC_MODE == CC1)
            _P05_IO_CC1();
        #endif
        #if (GPIO_P10_CC_MODE == CC1)
            _P10_IO_CC1();
        #endif
        #if (GPIO_P26_CC_MODE == CC1)
            _P26_IO_CC1();
        #endif
        break;
        
        case CC2:
        #if (GPIO_P06_CC_MODE == CC2)
            _P06_IO_CC2();
        #endif
        #if (GPIO_P14_CC_MODE == CC2)
            _P14_IO_CC2();
        #endif
        #if (GPIO_P15_CC_MODE == CC2)
            _P15_IO_CC2();
        #endif
        #if (GPIO_P27_CC_MODE == CC2)
            _P27_IO_CC2();
        #endif
        break;
        
        case CC3:
        #if (GPIO_P07_CC_MODE == CC3)
            _P07_IO_CC3();
        #endif
        #if (GPIO_P30_CC_MODE == CC3)
            _P30_IO_CC3();
        #endif
        break;

        default:
            break;
    }
}

void cc_io_disable(uint8_t cc)
{
    switch (cc)
    {
        case CC0:
        #if (GPIO_P02_CC_MODE == CC0)
            _P02_IO_MODE();
        #endif
        #if (GPIO_P04_CC_MODE == CC0)
            _P04_IO_MODE();
        #endif 
        #if (GPIO_P23_CC_MODE == CC0)
            _P23_IO_MODE();
        #endif 
        #if (GPIO_P25_CC_MODE == CC0)
            _P25_IO_MODE();
        #endif 
        break;

        case CC1:
        #if (GPIO_P05_CC_MODE == CC1)
            _P05_IO_MODE();
        #endif
        #if (GPIO_P10_CC_MODE == CC1)
            _P10_IO_MODE();
        #endif
        #if (GPIO_P26_CC_MODE == CC1)
            _P26_IO_MODE();
        #endif
        break;
        
        case CC2:
        #if (GPIO_P06_CC_MODE == CC2)
            _P06_IO_MODE();
        #endif
        #if (GPIO_P14_CC_MODE == CC2)
            _P14_IO_MODE();
        #endif
        #if (GPIO_P15_CC_MODE == CC2)
            _P15_IO_MODE();
        #endif
        #if (GPIO_P27_CC_MODE == CC2)
            _P27_IO_MODE();
        #endif
        break;
        
        case CC3:
        #if (GPIO_P07_CC_MODE == CC3)
            _P07_IO_MODE();
        #endif
        #if (GPIO_P30_CC_MODE == CC3)
            _P30_IO_MODE();
        #endif
        break;

        default:
            break;
    }
}

#if (CONFIF_SMPWM_VARIABLE_FREQ == 1)
void cc_set_freq(uint32_t freq)
{
    TIMER2_FREQ_SET(freq);
}

uint16_t cc_get_max_duty(void)
{
    uint16_t tr_val = TRL2 | ((TRH2_0 & 0xE0) << 3) | ((TRH2_1 & 0x60) << 6);

    return (TIMER2_MAX_VAL - tr_val - 1);
}
#endif
#endif